function A403()  
% Bayes分类器
% Bayes分类器通过某对象的先验概率，利用Bayes公式计算出其后验概率，即该对象属于某一类的概率，
% 选择具有最大后验概率的类作为该对象所属的类。
format long;     
% 两个特征（比如A-Scan的最大值和均方根）  
numSamples = 150;   
data1 = xlsread('A4_data_single.xlsx'); % 加载数据  
data2 = xlsread('A4_data_void.xlsx');   
    
% 计算 data1 的特征  
a1 = mean(data1(:, 150)); % 计算平均值  
m1 = max(data1(:, 150)); % 获取最大值  
s1 = sqrt(mean(data1(:, 150).^2)); % 计算均方根  
    
% 计算 data2 的特征  
a2 = mean(data2(:, 2)); % 计算平均值  
m2 = max(data2(:, 2)); % 获取最大值  
s2 = sqrt(mean(data2(:, 2).^2)); % 计算均方根  

% 生成数据集  
X = [randn(numSamples, 1) * 0.5 + s1, randn(numSamples, 1) * 0.5 + m1; % 单排钢筋  
     randn(numSamples, 1) * 0.5 + s2, randn(numSamples, 1) * 0.5 + m2]; % 空洞  

% 创建标签  
Y = [repmat({'rebar'}, numSamples, 1); repmat({'void'}, numSamples, 1)];   
tabulate(Y) % 显示标签的分布  

% 训练一个朴素贝叶斯分类器  
Mdl = fitcnb(X, Y, 'ClassNames', {'rebar', 'void'});   
    
% 预测 Z = [3.5, 6] 的新样本  
Z = [3.5, 6];   
Zclass = predict(Mdl, Z);   
disp(Zclass); % 显示预测的分类  

% 绘制 Gaussian 等值线  
subplot(2, 2, [1 3])   
gscatter(X(:, 1), X(:, 2), Y);   
h = gca;   
cxlim = h.XLim;   
cylim = h.YLim;   
hold on   

Params = cell2mat(Mdl.DistributionParameters);   
Mu = Params(2*(1:2)-1, 1:2); % 提取参数  
Sigma = zeros(2, 2, 2);   
    
for j = 1:2  
    Sigma(:, :, j) = diag(Params(2*j, :)).^2; % 创建对角协方差矩阵  
    xlim = Mu(j, 1) + 4*[-1 1]*sqrt(Sigma(1, 1, j));   
    ylim = Mu(j, 2) + 4*[-1 1]*sqrt(Sigma(2, 2, j));   
    f = @(x, y) arrayfun(@(x0, y0) mvnpdf([x0 y0], Mu(j, :), Sigma(:, :, j)), x, y);   
    fcontour(f, [xlim ylim]) % 绘制多元正态分布的等值线  
end   
    
h.XLim = cxlim;   
h.YLim = cylim;   
title('Naive Bayes Classifier -- GPR Data')   
xlabel('X')   
ylabel('Y')   
legend('rebar', 'void')   
hold off   

% 使用生成的 GPR 数据集重新训练朴素贝叶斯分类器   
Mdl1 = fitcnb(X, Y, 'ClassNames', {'rebar', 'void'});   
Mdl1.DistributionParameters   

% 估计 Mdl1 的混淆矩阵  
subplot(2, 2, 2)   
isLabels1 = resubPredict(Mdl1);   
ConfusionMat1 = confusionchart(Y, isLabels1);


% 重新训练分类器，使用不同的分布类型  
Mdl2 = fitcnb(X, Y, 'DistributionNames', {'normal', 'kernel'}, ...  
              'ClassNames', {'rebar', 'void'});   
Mdl2.DistributionParameters{1, 2};

% 估计 Mdl2 的混淆矩阵  
subplot(2, 2, 4)   
isLabels2 = resubPredict(Mdl2);   
ConfusionMat2 = confusionchart(Y, isLabels2);

end